package com.sgj.day1;

/**
 * @author 沈国纪
 * @date 2021/3/4 10:53
 */

/**
 * 先入先出的数据结构
 * 设计循环队列
  */
public class MyCircularQueue {

    private int[] circle;

    //头在数组的位置
    private int headIndex;

    //尾部在数组的位置
    private int tailIndex;

    //长度
    private int length;

    public MyCircularQueue(int k) {
        length = k + 1;
        circle = new int[length];
    }

    //插入
    public boolean enQueue(int value) {
        //如果尾部角标加上加上数字1然后对整个长度进行取余数，如果值等于head说明队列满了，不能在进行插入操作
        if (isFull()) {
            return false;
        }

        circle[tailIndex] = value;
        tailIndex = (tailIndex + 1) % length;

        return true;
    }

    //删除
    public boolean deQueue() {
        //说明队列为空
        if (isEmpty()) {
            return false;
        }

        circle[headIndex] = -1;
        headIndex = (headIndex + 1) % length;
        return true;
    }

    //从队首获取元素。如果队列为空，返回 -1
    public int Front() {
        if (isEmpty()) {
            return -1;
        }

        return circle[headIndex];
    }

    //获取队尾元素。如果队列为空，返回 -1 。
    public int Rear() {
        if (isEmpty()) {
            return -1;
        }

        return circle[(tailIndex - 1 + length) % length];
    }

    //检查循环队列是否为空。
    public boolean isEmpty() {
        return headIndex == tailIndex;
    }

    //检查循环队列是否已满
    public boolean isFull() {
        return headIndex == (tailIndex + 1) % length;
    }

    public static void main(String[] args) {
        MyCircularQueue myCircularQueue = new MyCircularQueue(3);
        // 插入队列 1
        boolean param1 = myCircularQueue.enQueue(1);
        // 插入队列 2
        boolean param2 = myCircularQueue.enQueue(2);
        // 插入队列 3
        boolean param3 = myCircularQueue.enQueue(3);
        // 插入队列 4
        boolean param4 = myCircularQueue.enQueue(4);
        // 获取队列尾元素
        int param5 = myCircularQueue.Rear();
        // 队列是否已满
        boolean param6 = myCircularQueue.isFull();
        // 删除队列
        boolean param7 = myCircularQueue.deQueue();
        // 获取队列首元素
        int front = myCircularQueue.Front();
        // 插入队列 4
        boolean param8 = myCircularQueue.enQueue(4);
        // 获取队列尾元素
        int param9 = myCircularQueue.Rear();
        System.out.println("param1：" + param1);
        System.out.println("param2：" + param2);
        System.out.println("param3：" + param3);
        System.out.println("param4：" + param4);
        System.out.println("param5：" + param5);
        System.out.println("param6：" + param6);
        System.out.println("param7：" + param7);
        System.out.println("front：" + front);
        System.out.println("param8：" + param8);
        System.out.println("param9：" + param9);
    }
}
